package cn.lcsjsxy.yxc.miscellaneous;

/*
* 递归方法的使用
* 1.递归方法：一个方法体内调用它自身
* 2.方法递归包含了一种隐式的循环，它会重复执行某段代码，但这种重复执行无需循环控制。
* 递归一定要向已知方向递归，否则这种递归就变成了无穷递归，类似于死循环。*/
public class Recursion {
    public static void main(String[] args) {
        //例1：计算1到100的和
//        方法1
//        int sum=0;
//        for(int i=1;i<=100;i++) {
//            sum += i;
//            System.out.println(sum+"\n");
//        }

        Recursion R1 = new Recursion();
        System.out.println(R1.recursion(100));
        System.out.println();
        System.out.println(R1.recursion1(5));
        System.out.println();
        System.out.println(R1.f(10));
        System.out.println();
        System.out.println(R1.fibonacci(4));
    }

    //方法2（递归）
    public int recursion(int n) {
        System.out.println(n);
        if (n == 1)
            return 1;  //判断是否是1，如果是1就返回1
        else
            return n + recursion(n - 1);  //这里，例如要1到100的和，那么这个就从100开始往前数，数到1再折回来相加到100
    }

    //例2：计算1到100的乘积
    public int recursion1(int n) {
        System.out.println(n);
        if (n == 1)
            return 1;
        else
            return n * recursion1(n - 1);  //和上面区别就是变成相乘了，依旧是倒着往前数然后到1的时候在折回来乘到100，结束
    }

    //例3：已知有一个数列：f（0）=1，f(1)=4,f(n+2)=2*f(n+1)+f(n)
    //其中n是大于0的整数，求f（10）的值
    public int f(int n){
        if(n==0)
            return 1;
        else if(n==1)
            return 4;
        else
            return 2*f(n-1)+f(n-2);
    }

    //例4：斐波那契数列的第n个值
    //1 1 2 3 5 8 13 21 34 55
    //规律：一个数等于前两个数之和
    //要求计算斐波那契数列的第n个值并打印出来

    public int fibonacci(int n){
        if(n==1 || n==2)
            return 1;
        else
            return fibonacci(n-1)+fibonacci(n-2);
        /*整个过程其实就是从后往前的，例如n=4，但是数列的第四个需要第三个加第而个，那我们就要求第三个，那么这样n=3，第三个
        * 呢又需要底二个和第一个的值，那么n就来到了1和2
        * 哎~第一个和第二个我们知道啊，都是1（return 1）嘛，这也是为啥要设置一个判断，这个判断在这，那么就说明递归到头了，
        * 不然就成死循环一类的玩意了。到头了之后，这个递归就会自动折回去计算，那我们知道了第一个和第二个，那第三个就有了，
        * 第二个和三个有了，那第四个自然也就算出来了以此类推，无论7.8.9还是多少，就都能算出来了*/
    }
}

